package com.excu.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * AES加密解密工具类
 * 使用AES算法进行加密和解密操作
 */
public class EncryptionUtils {
    // 加密算法
    private static final String ALGORITHM = "AES";
    // 加密模式和填充方式
    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
    
    /**
     * 加密方法
     * @param data 要加密的数据
     * @param key 加密密钥(16位、24位或32位)
     * @return 加密后的Base64字符串
     * @throws Exception 加密过程中可能出现的异常
     */
    public static String encrypt(String data, String key) throws Exception {
        // 验证密钥长度
        validateKeyLength(key);

        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        byte[] encryptedData = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    
    /**
     * 解密方法
     * @param encryptedData 加密后的Base64字符串
     * @param key 解密密钥(与加密密钥相同)
     * @return 解密后的原始数据
     * @throws Exception 解密过程中可能出现的异常
     */
    public static String decrypt(String encryptedData, String key) throws Exception {
        // 验证密钥长度
        validateKeyLength(key);
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedData = cipher.doFinal(decodedData);
        return new String(decryptedData, StandardCharsets.UTF_8);
    }
    
    /**
     * 验证密钥长度是否符合AES要求
     * @param key 要验证的密钥
     * @throws IllegalArgumentException 如果密钥长度不符合要求
     */
    static void validateKeyLength(String key) {
        int length = key.length();
        if (length != 16 && length != 24 && length != 32) {
            throw new IllegalArgumentException("密钥长度必须是16、24或32个字符");
        }
    }

    /**
     * @return 反参
     * @throws NoSuchAlgorithmException
     */
    public static Map<String,Object> getKeys() throws NoSuchAlgorithmException {
        // 初始化RSA密钥生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(4096); // 设置密钥长度
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 获取私钥并转为Base64字符串（便于存储和传输）
        String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
        // 获取公钥并转为Base64字符串
        String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
        Map<String, Object> map = new HashMap<>();
        map.put("privateKey",privateKey);
        map.put("publicKey",publicKey);
        return map;
    }
}
    